package com.ziki.kwdj.biz;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Stack;

import javax.swing.text.MutableAttributeSet;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTML.Tag;
import javax.swing.text.html.HTMLEditorKit.ParserCallback;
import javax.swing.text.html.parser.ParserDelegator;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ziki.kwdj.model.ClassInfo;
import com.ziki.kwdj.model.Info;

public class HtmlParser extends ParserCallback {
    private static String CHARSET = "utf-8";
    private static Logger log = LoggerFactory.getLogger(HtmlParser.class);
    private Info info;
    private Stack<ClassInfo> classStack;
    private boolean isPagination;
    private boolean isClassTime;
    private boolean isTd;
    private int maxPage;
    private int divLevel;

    public HtmlParser() {
        info = new Info();
        info.setNowTime(0);
        classStack = new Stack<ClassInfo>();
        info.setClassInfoStack(classStack);
        maxPage = 0;
        divLevel = 0;
        isPagination = false;
        isClassTime = false;
    }

    @Override
    public void handleText(char[] data, int pos) {
        // 取得课程名称
        // if (isClassLink) {
        // log.debug("*********class link text :{}**********", new
        // String(data));
        // isClassLink = false;
        // if (!lstClassInfo.isEmpty()) {
        // lstClassInfo.get(lstClassInfo.size() - 1).setClassName(new
        // String(data));
        // }
        // }
        String text = new String(data);
        if (isTd && StringUtils.isNotBlank(text) && text.endsWith("分钟") && isClassTime) {
            if (!classStack.isEmpty()) {
                text = text.replace("分钟", "");
                classStack.get(classStack.size() - 1).setClassMinute(NumberUtils.toInt(text));
                isClassTime = false;
            }
        }
    }

    @Override
    public void handleStartTag(Tag t, MutableAttributeSet a, int pos) {
        // 分布页DIV
        if (t == HTML.Tag.DIV) {
            String classStyle = (String) a.getAttribute(HTML.Attribute.CLASS);
            if ("pagination".equals(classStyle)) {
                isPagination = true;
            }
            // 分页DIV内的DIV层数
            if (isPagination) {
                divLevel++;
                log.debug("pagination div level:{}", divLevel);
            }
        }
        // 取得课程页数
        else if (t == HTML.Tag.OPTION && isPagination) {
            int value = NumberUtils.toInt((String) a.getAttribute(HTML.Attribute.VALUE));
            if (value > maxPage) {
                maxPage = value;
                info.setMaxPage(maxPage);
                log.debug("maxPage:{}", maxPage);
            }
        }
        // 取得课程ID
        else if (t == HTML.Tag.TD) {
            isTd = true;
        }
        // 取得课程ID
        else if (t == HTML.Tag.A) {
            String title = (String) a.getAttribute(HTML.Attribute.TITLE);
            String style = (String) a.getAttribute(HTML.Attribute.STYLE);
            String href = (String) a.getAttribute(HTML.Attribute.HREF);
            log.debug("<a title='{}' style='{}' href='{}'>", new Object[] { title, style, href });
            // if (StringUtils.isNotBlank(title) && "点击播放".equals(title) &&
            // StringUtils.isEmpty(style)) {
            // 根据链接的信息判断，取得未学完的课程信息
            if (StringUtils.isNotBlank(title) && !"点击播放".equals(title) && !"color:blue!important;".equals(style)) {
                if (StringUtils.isNotBlank(href) && href.startsWith("/ClassAction/View.aspx?infoID=")) {
                    String classId = href.substring(href.indexOf("infoID=") + 7);
                    if (StringUtils.isNotEmpty(classId)) {
                        ClassInfo classInfo = new ClassInfo();
                        classInfo.setClassID(classId);
                        classInfo.setClassName(title);
                        classStack.add(classInfo);
                        isClassTime = true;
                        log.info("***********classId:{}*************", classId);
                    }
                }
            }
        }
        // 分析取得课程信息
        else if (t == HTML.Tag.INPUT) {
            String id = (String) a.getAttribute(HTML.Attribute.ID);
            String value = (String) a.getAttribute(HTML.Attribute.VALUE);
            log.debug("<input id='{}' value='{}' >", new Object[] { id, value });
            if (StringUtils.isNotBlank(id)) {
                if (id.equals("alpenlicebe_c_progress_infoID")) {
                    info.setInfoID(value);
                    log.info("alpenlicebe_c_progress_infoID={}", value);
                } else if (id.equals("alpenlicebe_c_progress_userID")) {
                    info.setUserID(value);
                    log.info("alpenlicebe_c_progress_userID={}", value);
                } else if (id.equals("alpenlicebe_c_progress_sessionID")) {
                    info.setSessionID(value);
                    log.info("alpenlicebe_c_progress_sessionID={}", value);
                } else if (id.equals("nowTime")) {
                    info.setNowTime(NumberUtils.toInt(value));
                    info.setCurrentClassMinutes(info.getNowTime() / 60);
                    log.info("nowTime={}", value);
                }
            }
        }
    }

    @Override
    public void handleEndTag(Tag t, int pos) {
        // 取得课程ID
        if (t == HTML.Tag.DIV && isPagination) {
            divLevel--;
            // 分页DIV内的DIV层全结束时，分页DIV结束
            if (divLevel <= 1) {
                isPagination = false;
            }
            log.debug("pagination div level:{}", divLevel);
        } else if (t == HTML.Tag.TD) {
            isTd = false;
        }
    }

    @Override
    public void handleSimpleTag(Tag t, MutableAttributeSet a, int pos) {
        handleStartTag(t, a, pos);
    }

    public static Info parseInfo(InputStream content) {
        log.info("************************parseInfo");
        // 负责每次在调用其 parse 方法时启动一个新的 DocumentParser
        ParserDelegator ps = new ParserDelegator();
        // 解析结果驱动这些回调方法。
        HtmlParser parser = new HtmlParser();
        try {
            // 解析给定的流并通过解析的结果驱动给定的回调。
            ps.parse(new InputStreamReader(content, CHARSET), parser, true);
        } catch (Exception e) {
            log.error("Exception", e);
        } finally {
            if (content != null) {
                try {
                    content.close();
                } catch (IOException e) {
                }
            }
        }
        return parser.getInfo();
    }

    public static Info parseClassInfoList(InputStream content) {
        log.info("************************parseClassInfoList");
        // 负责每次在调用其 parse 方法时启动一个新的 DocumentParser
        ParserDelegator ps = new ParserDelegator();
        // 解析结果驱动这些回调方法。
        HtmlParser parser = new HtmlParser();
        try {
            // 解析给定的流并通过解析的结果驱动给定的回调。
            ps.parse(new InputStreamReader(content, CHARSET), parser, true);
        } catch (Exception e) {
            log.error("Exception", e);
        } finally {
            if (content != null) {
                try {
                    content.close();
                } catch (IOException e) {
                }
            }
        }
        return parser.getInfo();
    }

    public Info getInfo() {
        return info;
    }
}
